{% extends "base.html" %} {% block title %}Papers · {{ app_name }}{% endblock %} {% macro paper(p) %}
{% set b = p.claim.badge if p.claim.badge is mapping else none %}
{% if b %}{{ b.icon }} {{ b.title }}{% if b.period %} · {{ b.period }}{% endif %}{% if b.detail %} {{ b.detail }}{% endif %} {% elif p.kind == 'collar' %}🔗 Collar {{ 'on' if p.claim.phase == 'on' else 'off' }}{% if p.claim.handler_name %} · {{ p.claim.handler_name }}{% endif %} {% else %}📊 {{ 'Lifetime' if p.claim.scope == 'lifetime' else 'Pack' }} summary{% endif %}
{{ p.status }}
{% if p.detail %}
{{ p.detail }}
{% endif %} {% if p.checked %}
countersigned figures: {{ p.checked|join(', ') }}
{% endif %} {% if p.earlier %}
signed by an earlier Pup ID, fingerprint {{ p.earlier }}
{% elif p.origin == 'imported' %}
🧳 from another box, issued {{ p.issued_at|local('%Y-%m-%d') }}
{% endif %} {% if p.kind == 'summary' %} {% for k, v in p.totals %}{% endfor %}
as signed on {{ p.issued_at|local('%Y-%m-%d') }}; not recomputed
{{ k }}{{ v }}
{% endif %} paper {{ p.short }} · #{{ p.seq }}{% if p.earned_at %} · earned {{ p.earned_at|local('%Y-%m-%d') }}{% endif %} · the signed file
{% endmacro %} {% block body %}

📜 Papers a record of what was true when it was signed 📖

{% if ident.state == 'none' %}

Papers are signed by your Pup ID. Make one and every badge you hold gets its paper on the next tick.

{% endif %} {% if n_unpapered and ident.state == 'ready' %}

{{ n_unpapered }} badge(s) are waiting for their paper — it lands on the next tick.

{% endif %}

Earned here

{% for p in case.earned %}{{ paper(p) }}{% else %}

No papers yet.

{% endfor %}
{% if case.brought %}

Brought with you

Papers from your other box. They are your history — they count toward nothing here: not XP, not your rank, not your badges, not a share card.

{% for p in case.brought %}{{ paper(p) }}{% endfor %}
{% endif %} {% if case.collars %}

Collars

{% for p in case.collars %}{{ paper(p) }}{% endfor %}
{% endif %} {% if case.summaries %}

Summaries

{% for p in case.summaries %}{{ paper(p) }}{% endfor %}
{% endif %} {% if case.earlier %}

Signed by an earlier Pup ID

A key this box no longer holds signed these — the game came back from a backup without its key. They stay as history: they are not the word of the Pup ID on this box, and they never travel in pup.json. Every badge you hold gets its paper from the Pup ID this box holds.

{% for p in case.earlier %}{{ paper(p) }}{% endfor %}
{% endif %}

A countersignature says what its signer SIGNED — that they were the other party to a collar, or that a badge is dated inside their collar. It does not say they watched. A signer's kind (a person, an AI) is their own signed declaration, never something anyone checked.

{% endblock %}